package info

import (
	"encoding/json"
	"fmt"
	"time"

	"github.com/yusufpapurcu/wmi"
	"gopkg.in/ini.v1"
)

// 显卡
type Win32_VideoController struct {
	AcceleratorCapabilities      []int16  `json:"图形和三维功能"`
	AdapterCompatibility         string   `json:"名称或标识符"`
	AdapterDACType               string   `json:"适配器的兼容性"`
	AdapterRAM                   int32    `json:"内存大小"`
	Availability                 uint16   `json:"可用性"`
	CapabilityDescriptions       []string `json:"加速器功能说明"`
	Caption                      string   `json:"说明"`
	ColorTableEntries            int32    `json:"系统颜色表的大小"`
	ConfigManagerErrorCode       int32    `json:"配置管理器错误代码"`
	ConfigManagerUserConfig      bool     `json:"用户定义的配置"`
	CreationClassName            string
	CurrentBitsPerPixel          int32     `json:"显示每个像素的位数"`
	CurrentHorizontalResolution  int32     `json:"当前水平像素数"`
	CurrentNumberOfColors        int64     `json:"分辨率支持的颜色数"`
	CurrentNumberOfColumns       int32     `json:"视频控制器列数"`
	CurrentNumberOfRows          int32     `json:"视频控制器行数"`
	CurrentRefreshRate           int32     `json:"视器图像的频率"`
	CurrentScanMode              int16     `json:"扫描模式"`
	CurrentVerticalResolution    int32     `json:"垂直像素数"`
	Description                  string    `json:"描述"`
	DeviceID                     string    `json:"系统上唯一标识符"`
	DeviceSpecificPens           uint32    `json:"设备的笔数"`
	DitherType                   uint32    `json:"制器的抖动类型"`
	DriverDate                   time.Time `json:"驱动程序上次修改日期和时间"`
	DriverVersion                string    `json:"驱动程序版本号"`
	ErrorCleared                 bool      `json:"是否开启错误清除"`
	ErrorDescription             string    `json:"错误描述"`
	ICMIntent                    uint32
	ICMMethod                    uint32    `json:"ICM的方法"`
	InfFilename                  string    `json:"inf文件的路径"`
	InfSection                   string    `json:"WINinf文件的路径"`
	InstallDate                  time.Time `json:"安装时间"`
	InstalledDisplayDrivers      string    `json:"设备驱动程序的名称"`
	LastErrorCode                uint32    `json:"最后一个错误代码"`
	MaxMemorySupported           uint32    `json:"最大支持内存量"`
	MaxNumberControlled          uint32    `json:"最大支持可寻址实体数"`
	MaxRefreshRate               uint32    `json:"最大刷新率"`
	MinRefreshRate               uint32    `json:"最小刷新率"`
	Monochrome                   bool      `json:"单色"`
	Name                         string    `json:"名称"`
	NumberOfColorPlanes          uint16    `json:"颜色平面当前数量"`
	NumberOfVideoPages           uint32    `json:"分辨率和可用内存时支持的视频页数"`
	PNPDeviceID                  string    `json:"即插即用逻辑设备设备标识符"`
	PowerManagementCapabilities  []uint16  `json:"电源相关功能"`
	PowerManagementSupported     bool      `json:"电源管理"`
	ProtocolSupported            uint16    `json:"协议支持"`
	ReservedSystemPaletteEntries uint32    `json:"系统调色板中保留条目数"`
	SpecificationVersion         uint32    `json:"初始化数据规范版本号"`
	Status                       string    `json:"状态"`
	StatusInfo                   uint16    `json:"逻辑设备状态"`
	SystemCreationClassName      string
	SystemName                   string    `json:"系统名称"`
	SystemPaletteEntries         uint32    `json:"当前颜色索引条目数"`
	TimeOfLastReset              time.Time `json:"上次重置此控制器时间"`
	VideoArchitecture            uint16    `json:"视频体系结构的类型"`
	VideoMemoryType              uint16    `json:"视频内存的类型"`
	VideoMode                    uint16    `json:"视频模式"`
	VideoModeDescription         string    `json:"视频控制器的当前分辨率颜色和扫描模式设置"`
	VideoProcessor               string    `json:"视频处理器"`
}

func VideoControllerInfo() (info []Win32_VideoController, err error) {
	err1 := wmi.Query("Select * from Win32_VideoController", &info)
	if err1 != nil {
		return nil, err1
	}
	return info, nil
}
func MapJsonVideoControllerInfo() (data []map[string]interface{}, err error) {

	cpu, err := VideoControllerInfo()
	if err != nil {
		return data, err
	}
	t, jsonerr := json.Marshal(cpu)
	json.Unmarshal(t, &data)
	cfg, err1 := ini.Load("./info/videoconfig.ini")
	if err1 != nil {
		return data, err
	}
	videKe := "视频内存的类型"
	d := cfg.Section("").Key(videKe)
	for _, v := range data {
		for k, v1 := range v {
			if k == videKe {
				v[k] = cfg.Section(d.String()).Key(fmt.Sprintf("%v", v1)).String()
				//fmt.Println(cfg.Section(d.String()).Key(fmt.Sprintf("%v", v1)))
				continue
			}
			if k == "内存大小" {
				v["内存大小"] = int64(v1.(float64))
				continue
			}
			if k == "可用性" {
				v[k] = cfg.Section(cfg.Section("").Key("可用性").String()).Key(fmt.Sprintf("%v", v1)).String()
				//fmt.Println(cfg.Section(d.String()).Key(fmt.Sprintf("%v", v1)))
				continue
			}
			if k == "配置管理器错误代码" {
				v[k] = cfg.Section(cfg.Section("").Key("配置管理器错误代码").String()).Key(fmt.Sprintf("%v", v1)).String()
				//fmt.Println(cfg.Section(d.String()).Key(fmt.Sprintf("%v", v1)))
				continue
			}
			if k == "扫描模式" {
				v[k] = cfg.Section(cfg.Section("").Key("扫描模式").String()).Key(fmt.Sprintf("%v", v1)).String()
				//fmt.Println(cfg.Section(d.String()).Key(fmt.Sprintf("%v", v1)))
				continue
			}
			if k == "制器的抖动类型" {
				v[k] = cfg.Section(cfg.Section("").Key("制器的抖动类型").String()).Key(fmt.Sprintf("%v", v1)).String()
				//fmt.Println(cfg.Section(d.String()).Key(fmt.Sprintf("%v", v1)))
				continue
			}
			if k == "视频体系结构的类型" {
				v[k] = cfg.Section(cfg.Section("").Key("视频体系结构的类型").String()).Key(fmt.Sprintf("%v", v1)).String()
				//fmt.Println(cfg.Section(d.String()).Key(fmt.Sprintf("%v", v1)))
				continue
			}
		}
	}
	if jsonerr != nil {
		return data, jsonerr
	}
	return data, nil

}
